class Brano
  attr_reader :aut, :tit, :dim   # accesso in lettura 
  attr_accessor :gra             # il gradimento sara' cambiato dall'esterno

  def initialize(a,t,d,g)
    @aut=a          # autore 
    @tit=t          # titolo
    @dim =d        # dimensione del brano in Kb
    @gra =g        # gradimento 
  end

  def to_s
    "A:#@aut  T:#@tit  D:#@dim  G:#@gra \n"
  end

  # due brani sono uguali se hanno lo stesso autore e titolo
  def ==(b)
    @aut==b.aut && @tit==b.tit
  end

end #claase brano



class Lettore
  attr_accessor :lista_brani, :spazio
  
  

  def initialize(cmax)
    @lista_brani = []
    @spazio = @spazio_max = cmax
  end
  
  def inserisci_brano(b)
    return false if @lista_brani.include?(b)
    return false if @spazio-b.dim<0
    @spazio -= b.dim
    @lista_brani<<b
    return true
  
  end
  
def cancella_brano(b)
  if @lista_brani.include?(b)
    @spazio+=@lista_brani[@lista_brani.index(b)].dim 
    @lista_brani.delete(b) 
    return true
  else
    return false  
  end
 end
 
def to_s
   "#{@lista_brani} spazio disponibile #{@spazio}"
end

def grad_tot
  tot=0
  for i in @lista_brani
    tot += i.gra
  end
 return tot
end

def cambia_gradimento(aut,delta)
  con=0
 for i in @lista_brani
   if i.aut==aut
     i.gra+=delta
     con+=1
   end
   end
 return con
 end


def top_author(x)
  h_dim={}
  h_gra={}
  for i in @lista_brani
    if h_dim.include?(i.aut)
      h_dim[i.aut]+=i.dim
      h_gra[i.aut]+=i.gra
    else
      h_dim[i.aut]=i.dim
      h_gra[i.aut]=i.gra
    end
  end
  s=0
  for i in h_dim.keys
    if h_dim[i]<=x.spazio
      if h_gra[i]>s
        s=h_gra[i]
        ris=i
      end
    end 
  end
  for i in @lista_brani
    if i.aut==ris
      x.inserisci_brano(i)
    end
  end
  return s
end
  
end# classe lettore


def main

  # crea un lettore con circa 4Gb di memoria 
  ipod = Lettore.new(4000000);
  
  # inserimenti
  puts ipod.inserisci_brano(Brano.new("Beatles", "Yesterday", 3600, 10)) #t
  puts ipod.inserisci_brano(Brano.new("Mina", "Yesterday", 3650, 8)) #t
  puts ipod.inserisci_brano(Brano.new("Beethoven", "Yesterday",3993000,10)) #f
  puts ipod.grad_tot() # 18
  puts ipod.inserisci_brano(Brano.new("U2", "Gone", 4000, 12)) # t
  puts ipod.inserisci_brano(Brano.new("U2", "Please", 4500, 13)) #t
  puts ipod.inserisci_brano(Brano.new("U2", "Gone", 2000, 13)) # f
  puts ipod 

  #cancellazioni
  puts ipod.cancella_brano(Brano.new("Mina", "Yesterday", 0, 0)) #t
  puts ipod.cancella_brano(Brano.new("U3", "Gone", 4000, 12)) # f
  puts ipod.inserisci_brano(Brano.new("Mina", "Yesterday", 3650, 8)) #t

  
  # inserimenti brani grandi	    
  puts ipod.inserisci_brano(Brano.new("Mozart", "Don Giovanni", 3990000, 33))#f
  puts ipod.grad_tot() # 43
  puts ipod.inserisci_brano(Brano.new("Mozart", "Flauto Magico", 12000, 20))#t
    
  # altri inserimenti
  puts ipod.inserisci_brano(Brano.new("Beatles", "Let it be", 4800, 11))#t
  puts ipod.inserisci_brano(Brano.new("Modugno", "Volare", 4000, 25)) #t
  puts ipod.inserisci_brano(Brano.new("Mina", "E penso a te", 4500, 13))#t
  puts ipod.inserisci_brano(Brano.new("Battisti", "Viaggiare", 4300, 7))#t
  puts ipod.inserisci_brano(Brano.new("Battisti", "Ancora tu", 3600, 14))#t
  puts ipod.inserisci_brano(Brano.new("Battisti","Pensieri e parole",3400,15))
  puts ipod # Spazio disponibile: 3947650

  puts ipod.grad_tot() # 148
  puts(ipod.cambia_gradimento("Battisti",2))# # 3	    
  puts(ipod.cambia_gradimento("Gaber",2))#    # 0	    
  puts(ipod.grad_tot()) # # 154

  # crea un secondo lettore piu' piccolo
  nano = Lettore.new(20000)#
  puts ipod.inserisci_brano(Brano.new("Pavarotti", "O sole mio", 3000, 15))#t
  puts ipod.inserisci_brano(Brano.new("Pavarotti", "Aida", 18000, 35))#t

  puts ipod.top_author(nano)# # 42
  puts nano #
  # A:Battisti T:Ancora tu D:3600 G:16
  # A:Battisti T:Pensieri e parole D:3400 G:17
  # A:Battisti T:Viaggiare D:4300 G:9
  # Spazio disponibile: 8700
  
  puts ipod.cambia_gradimento("Mina",15) # # 2	    
  nano = Lettore.new(20000)#
  puts ipod.top_author(nano)# # 51
  puts nano #

end

main